package docmanager.business.objects;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import bf.DataAccess;

public class Documento extends BusinessObject {

	
	int idTipoDoc;
	String codigo;
	int version;
	boolean ubicuo;
	int cantidadAccesos;
	String descripcion;
	String nombreArchivo;
	
	List<Integer> sectores;
	
	   public List<Integer> getSectores() {
		return sectores;
	}


	public void setSectores(List<Integer> sectores) {
		this.sectores = sectores;
	}


	private Documento()
	   {
		   
	   }
	   
	   
	   public Documento(int idTipoDoc, String codigo, 
			   int version, boolean ubicuo, int cantidadAccesos,
			   String descripcion, String nombreArchivo)
	   {
		   this.idTipoDoc = idTipoDoc;
		   this.version = version;
		   this.ubicuo = ubicuo;
		   this.cantidadAccesos = cantidadAccesos;
		   this.descripcion = descripcion;
		   this.nombreArchivo = nombreArchivo;
		   this.codigo = codigo;
	   }
	   
	   
	   
	
	   public Documento(Connection conn, int id) throws SQLException
	    {
	      this.conn = conn;
	      this.id = id;
	      String query = "SELECT id, id_tipo_doc,codigo, version, ubicuo, cantidadAccesos, descripcion, nombreArchivo FROM documentos WHERE id="+id;
	      ResultSet rs = DataAccess.selectQueryStatic(conn, query);
	      rs.next(); 
	      construirDocumento(rs);
	      rs.close();
	    }




	private void construirDocumento(ResultSet rs) throws SQLException {
		  this.id = rs.getInt("id");
	      this.idTipoDoc = rs.getInt("id_tipo_doc");
	      this.codigo = rs.getString("codigo");
	      this.version = rs.getInt("version");
	      
	      int temp = rs.getInt("ubicuo");
	      if (temp == 1)
	      {
	          this.ubicuo = true;
	      }
	      else
	      {
	          this.ubicuo = false;
	      }
	      this.cantidadAccesos = rs.getInt("cantidadAccesos");
	      this.descripcion = rs.getString("descripcion");
	      this.nombreArchivo = rs.getString("nombreArchivo");
	}
	 
	   

	   
	public int getIdTipoDoc() {
		return idTipoDoc;
	}


	public void setIdTipoDoc(int idTipoDoc) {
		this.idTipoDoc = idTipoDoc;
	}


	public String getCodigo() {
		return codigo;
	}


	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}


	public int getVersion() {
		return version;
	}


	public void setVersion(int version) {
		this.version = version;
	}


	public boolean isUbicuo() {
		return ubicuo;
	}


	public void setUbicuo(boolean ubicuo) {
		this.ubicuo = ubicuo;
	}


	public int getCantidadAccesos() {
		return cantidadAccesos;
	}


	public void setCantidadAccesos(int cantidadAccesos) {
		this.cantidadAccesos = cantidadAccesos;
	}


	public String getDescripcion() {
		return descripcion;
	}


	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}


	public String getNombreArchivo() {
		return nombreArchivo;
	}


	public void setNombreArchivo(String nombreArchivo) {
		this.nombreArchivo = nombreArchivo;
	}

	
	
	
	@Override
	public void guardarNuevo(Connection conn) throws SQLException {
		int ubic = 0;
		if (ubicuo)
			ubic = 1;
		String query = "INSERT INTO documentos(id_tipo_doc, codigo, version, ubicuo," +
				"cantidadAccesos, descripcion, nombreArchivo) " +
				"values("+this.getIdTipoDoc() +",'" + this.getCodigo() + "'," + this.version +
				"," + ubic + "," + this.cantidadAccesos + ",'" + this.descripcion +
				"','" + this.nombreArchivo + "')";
System.out.println("Ejecutando: " + query);
		int id = DataAccess.insertionQueryStatic(conn, query);
         this.id = id;
	}

	// Ver el tema de recuperar el ID!!!
	
	public void asignarSector(Connection conn, int idSector) throws SQLException
	{
		String query = "INSERT INTO documentos_sectores(id_documento, id_sector) values(" +
				+ this.getId() +"," + idSector +")";
		DataAccess.dmlQueryStatic(conn, query);
	}
	
	public static List<Documento> obtenerDocumentos(Connection conn, int idTipoDoc, int idSector)
	throws SQLException
	{
	  	String select = "SELECT documentos.id, id_tipo_doc,codigo, version, ubicuo, cantidadAccesos, descripcion, nombreArchivo ";
	  	String from = "FROM documentos, documentos_sectores ";
	  	String where = " WHERE documentos.id_tipo_doc="+idTipoDoc;
	  	where += " and documentos_sectores.id_sector = "+idSector;
	  	where += " and documentos_sectores.id_documento = documentos.id";
	  	String orderBy = " ORDER BY codigo";
	  	String query = select + from + where + orderBy;
	  	ResultSet rs = DataAccess.selectQueryStatic(conn, query);
	  	List<Documento> lista = new LinkedList<Documento>();
	  	while(rs.next())
	  	{
	  		Documento doc = new Documento();
	  		doc.construirDocumento(rs);
	  		lista.add(doc);
	  	}
	  	rs.close();
	  	// Ahora, debemos agregar los documentos ubicuos.
	  	select = "SELECT documentos.id, id_tipo_doc,codigo, version, ubicuo, cantidadAccesos, descripcion, nombreArchivo ";
	  	from = "FROM documentos ";
	  	where = " WHERE documentos.id_tipo_doc="+idTipoDoc;
	  	where += " AND ubicuo = 1";
	  	query = select + from + where;
	  	rs = DataAccess.selectQueryStatic(conn, query);
	  	while(rs.next())
	  	{
	  		Documento doc = new Documento();
	  		doc.construirDocumento(rs);
	  		lista.add(doc);
	  	}
	  	rs.close();	  	
	  	return lista;
	}

	
	public static List<Documento> obtenerDocumentos(Connection conn, int idTipoDoc)
	throws SQLException
	{
	  	String select = "SELECT documentos.id, id_tipo_doc,codigo, version, ubicuo, cantidadAccesos, descripcion, nombreArchivo ";
	  	String from = "FROM documentos";
	  	String where = " WHERE documentos.id_tipo_doc="+idTipoDoc;
	  	String orderby = " ORDER BY codigo";
	  	String query = select + from + where + orderby;
	  	ResultSet rs = DataAccess.selectQueryStatic(conn, query);
	  	List<Documento> lista = new LinkedList<Documento>();
	  	while(rs.next())
	  	{
	  		Documento doc = new Documento();
	  		doc.construirDocumento(rs);
	  		lista.add(doc);
	  	}
	  	rs.close();
	  	return lista;
	}


	public void guardarContenido(Connection conn, String absolutePath) throws SQLException, IOException {
		FileInputStream fis = null;
		String sql = "UPDATE documentos SET contenido = ? WHERE id = '" + getId() + "'";
		PreparedStatement stmt = conn.prepareStatement(sql);
		File contenido = new File(absolutePath);
		fis = new FileInputStream(contenido);
		stmt.setBinaryStream(1, fis, (int) contenido.length());
		stmt.execute();
		fis.close();
	}
	
	public void cargarSectores(Connection conn) throws SQLException
	{
		this.sectores = new LinkedList();
		String query = "SELECT id_sector from documentos_sectores where id_documento=" + this.getId();
System.out.println("QUERY: " + query);		
		ResultSet rs = DataAccess.selectQueryStatic(conn, query);
		while (rs.next())
		{
			int idSector = rs.getInt("id_sector");
			this.sectores.add(new Integer(idSector));
		}
		rs.close();
	}
	
	public void cargarSectores() throws SQLException
	{
		this.cargarSectores(this.getConn());
	}
	
	
	public void modificar(Connection conn) throws SQLException
	{
		this.setConn(conn);
		this.modificar();
	}
	
	public void modificar() throws SQLException
	{
		int ubic = 0;
		if (ubicuo)
			ubic = 1;
		Connection conn = this.getConn();
		String query = "UPDATE documentos "

				+ " SET codigo='" + this.getCodigo() + "'"
				+ ", version= " + this.getVersion() 
				+ ", id_tipo_doc= " + this.getIdTipoDoc()
				+ ", ubicuo= " + ubic
				+ ", cantidadAccesos= " + this.getCantidadAccesos()
				+ ", descripcion='" + this.getDescripcion() + "'"
				+ ", nombreArchivo='" + this.getNombreArchivo() + "'"
				+ " WHERE id = " + this.getId();
System.out.println("QUERY: " + query);
		DataAccess.dmlQueryStatic(conn, query);
	}
	
	
	
}
